package shell

import (
	"bufio"
	"fmt"
	log "github.com/sirupsen/logrus"
	"os/exec"
)

func ShellFileExec(scriptPath string) (success bool, msg string) {
	//cmd := exec.Command("bash", scriptPath)
	//output, err := cmd.CombinedOutput()
	//if err != nil {
	//	msg = fmt.Sprint("执行 %v 脚本失败: %v\n输出: %s", scriptPath, err, string(output))
	//	succes = false
	//	log.Error(msg)
	//} else {
	//	succes = true
	//	msg = fmt.Sprintf("脚本 %v 执行成功 | 输出: %s\n", scriptPath, string(output))
	//	log.Infof(msg)
	//}
	//return succes, msg
	success = true
	// 流式输出日志
	cmd := exec.Command("bash", scriptPath)

	// 创建标准输出和标准错误管道
	stdout, err := cmd.StdoutPipe()
	if err != nil {
		msg = fmt.Sprintf("创建标准输出管道失败: %v", err)
		success = false
		log.Error(msg)
		return success, msg
	}

	stderr, err := cmd.StderrPipe()
	if err != nil {
		msg = fmt.Sprintf("创建标准错误管道失败: %v", err)
		success = false
		log.Error(msg)
		return success, msg
	}

	// 启动命令
	if err := cmd.Start(); err != nil {
		msg = fmt.Sprintf("启动命令失败: %v", err)
		log.Error(msg)
		return success, msg
	}

	// 用 goroutine 实时读取标准输出
	go func() {
		scanner := bufio.NewScanner(stdout)
		for scanner.Scan() {
			// 实时输出脚本的标准输出
			log.Infof("%s", scanner.Text())
		}
		if err := scanner.Err(); err != nil {
			log.Infof("读取标准输出时出错: %v", err)
		}
	}()

	// 用 goroutine 实时读取标准错误
	go func() {
		scanner := bufio.NewScanner(stderr)
		for scanner.Scan() {
			// 实时输出脚本的错误信息
			log.Errorf("%s", scanner.Text())
		}
		if err := scanner.Err(); err != nil {
			log.Infof("读取标准错误时出错: %v", err)
		}
	}()

	// 等待命令执行完成并获取结果
	err = cmd.Wait()
	if err != nil {
		success = false
		log.Error(err.Error())
	}
	return success, msg
}

func ShellCommandExec(command string) (success bool, msg string) {
	// 使用 exec.Command 直接执行 shell 命令
	cmd := exec.Command("bash", "-c", command)
	output, err := cmd.CombinedOutput()
	if err != nil {
		msg = fmt.Sprint("执行 %v 命令失败: %v\n输出: %s", command, err, string(output))
		log.Error(msg)
		success = true
	} else {
		success = false
		msg = fmt.Sprint("命令 %v 执行成功 | 输出: %s\n", command, string(output))
		log.Infof(msg)
	}
	return success, msg
}
